﻿using System;
using System.Data.SqlClient;
using System.Data;
using System.Collections.Generic;
using SeguradoraIA.Framework.Data;
using SeguradoraIA.Framework.Log;
using SeguradoraIA.Data.TO;

namespace SeguradoraIA.Data.Impl
{
    public class ProfissaoDAO : IProfissaoDAO
    {
		#region 'Conexao'
        private const string ConnectionString = "SeguradoraIA";
		#endregion
		
		#region 'Metodos padrao'

        #region 'ObterTodos'
        /// <summary>Metodo encarregado de obter todos os registros.</summary>
        /// <returns>Lista da entidade</returns>
        /// <remarks>BSI</remarks>
        public IList<ProfissaoTO> ObterTodos()
        {
            IList<ProfissaoTO> listTO = new List<ProfissaoTO>();

            const string statement = "Profissao_SPS";
            LogManager.LogSQL(statement);

            using (SqlDataReader rdr = SqlHelper.ExecuteReader(
                ConnectionString,
                CommandType.StoredProcedure, statement))
            {
                while (rdr.Read())
                {
                    listTO.Add(ExtractData(rdr));
                }
            }

            LogManager.LogReturn(listTO);
            return listTO;
        }
        #endregion
        
        // Por não haver PK, este método não pode manipular o registro específico, causando um comportamento diferente do esperado
        #region 'Obter'
        /// <summary>Metodo encarregado de obter um registro. Busca realizada pela chave primaria da tabela.</summary>
        /// <returns>Entidade</returns>
        /// <remarks>BSI</remarks>
        public ProfissaoTO Obter(int idProfissao)
        {
            LogManager.LogEntryParameters(idProfissao);

            ProfissaoTO to = null;

            List<SqlParameter> parameters = new List<SqlParameter> { 
				new SqlParameter("@idProfissao",SqlDbType.Int){Value = idProfissao} 
            };
            
            const string statement = "Profissao_SPS";
            LogManager.LogSQL(statement, parameters);

            using (SqlDataReader rdr = SqlHelper.ExecuteReader(
                ConnectionString, CommandType.StoredProcedure, statement, parameters.ToArray()))
                if (rdr.Read())
                {
                    to = ExtractData(rdr);
                }

            return to;
        }
        #endregion
        
        #region 'Listar'
        /// <summary>Metodo encarregado de obter uma lista de registros. Busca realizada por um ou mais campos da entidade.</summary>
        /// <returns>Lista da entidade</returns>
        /// <remarks>BSI</remarks>
        public IList<ProfissaoTO> Listar(ProfissaoTO to)
        {
            IList<ProfissaoTO> listTO = new List<ProfissaoTO>();

            List<SqlParameter> parameters = new List<SqlParameter> { 
				new SqlParameter("@Descricao",SqlDbType.NVarChar,200){Value = to.Descricao ??(object) DBNull.Value}, 
				new SqlParameter("@IdProfissao",SqlDbType.Int){Value = to.IdProfissao > 0 ? (object)to.IdProfissao : DBNull.Value} 
            };
            
            const string statement = "Profissao_SPS";
            LogManager.LogSQL(statement, parameters);

            using (SqlDataReader rdr = SqlHelper.ExecuteReader(
                ConnectionString, CommandType.StoredProcedure, statement, parameters.ToArray()))
                while (rdr.Read())
                {
                    listTO.Add(ExtractData(rdr));
                }

            return listTO;
        }
        #endregion
		
		#region 'Inserir'
        /// <summary>Metodo encarregado de inserir um registro.</summary>
        /// <returns>Entidade inserida.</returns>
        /// <remarks>BSI</remarks>
        public void Inserir(ProfissaoTO to)        {
            LogManager.LogEntryParameters(to);

            List<SqlParameter> parameters = new List<SqlParameter>{
				new SqlParameter("@Descricao",SqlDbType.NVarChar,200){Value = to.Descricao}, 
				new SqlParameter("@IdProfissao",SqlDbType.Int){Value = to.IdProfissao}
            };
            
            const string statement = "Profissao_SPI";
            LogManager.LogSQL(statement, parameters);

            var returnCode = SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, statement, parameters.ToArray());
            LogManager.LogReturn(returnCode);

            to.IdProfissao = System.Convert.ToInt32(returnCode);
        }

		#endregion
		
		// Por não haver PK, este método não pode manipular o registro específico, causando um comportamento diferente do esperado
		#region 'Excluir'
        /// <summary>Metodo encarregado de excluir um registro.</summary>
        /// <remarks>BSI</remarks> 
        public void Excluir(int idProfissao)
        {
            LogManager.LogEntryParameters(idProfissao);

            List<SqlParameter> parameters = new List<SqlParameter> { 
				new SqlParameter("@idProfissao",SqlDbType.Int){Value = idProfissao} 
            };

            const string statement = "Profissao_SPD";
            LogManager.LogSQL(statement, parameters);

            var afectedRows = SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, statement, parameters.ToArray());
            LogManager.LogReturn(afectedRows);
        }        
		#endregion

		#region 'Atualizar'
        /// <summary>Metodo encarregado de atualizar um registro.</summary>
        /// <returns>Entidade atualizada.</returns>
        /// <remarks>BSI</remarks>
        public void Atualizar(ProfissaoTO to)
        {
            LogManager.LogEntryParameters(to);

            List<SqlParameter> parameters = new List<SqlParameter>{ 
				new SqlParameter("@Descricao",SqlDbType.NVarChar,200){Value = to.Descricao}, 
				new SqlParameter("@IdProfissao",SqlDbType.Int){Value = to.IdProfissao} 
            };

            const string statement = "Profissao_SPU";
            LogManager.LogSQL(statement, parameters);

            var afectedRows = SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, statement, parameters.ToArray());
            LogManager.LogReturn(afectedRows);
        }
        #endregion
		   
		#region 'ExtractData'
        /// <summary>Extracao de dados do DataReader para uma entidade</summary>
        /// <returns>Entidade preenchida.</returns>
        /// <remarks>BSI</remarks>    
        private static ProfissaoTO ExtractData(IDataRecord rdr)
        {
            return new ProfissaoTO
            { 				Descricao = rdr.GetString(rdr.GetOrdinal("Descricao")), 
				IdProfissao = rdr.GetInt32(rdr.GetOrdinal("IdProfissao")), 
 };
        }
        #endregion
        
        #endregion
    }
}